# 配置文件

import os

# 获取当前文件所在目录的绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__))

# SAM2模型配置
SAM2_CONFIG = {
    # 模型路径
    'model_checkpoint': os.path.join(current_dir, '../sam2/checkpoints/sam2.1_hiera_large.pt'),
    'model_config': os.path.join(current_dir, '../sam2/sam2/configs/sam2.1/sam2.1_hiera_l.yaml'),
    
    # 自动掩码生成器参数
    'automatic_mask_generator': {
        'points_per_side': 42,           # 每边采样点数
        'points_per_batch': 84,          # 每批处理的点数
        'pred_iou_thresh': 0.8,          # 预测IoU阈值
        'stability_score_thresh': 0.95,  # 稳定性评分阈值
        'stability_score_offset': 1.0,   # 稳定性评分偏移
        'mask_threshold': 0.0,           # 掩码阈值
        'box_nms_thresh': 0.6,           # 边界框NMS阈值
        'crop_n_layers': 1,              # 裁剪层数
        'crop_nms_thresh': 0.8,          # 裁剪NMS阈值
        'crop_overlap_ratio': 512 / 1500,# 裁剪重叠比率
        'min_mask_region_area': 100,     # 最小掩码区域面积
    }
}

# 图像分幅处理配置
IMAGE_TILING = {
    'enabled': True,           # 是否启用分幅处理
    'tile_size': (2048, 2048), # 分幅大小，默认比滑窗大一些
    'enable_auto_size': True,  # 是否根据图像大小自动调整分幅大小
    'max_tile_size': 4096,     # 最大分幅大小
    'min_tile_size': 512,      # 最小区分幅大小
    'auto_size_factor': 0.8,   # 自动计算分幅大小时的因子
    'save_tiles': True,        # 是否保存分幅结果
    'tiles_dir': 'data/tiles', # 分幅结果保存目录
    'load_existing_tiles': True, # 是否加载已有的分幅结果
    'tile_image_format': 'png' # 分幅图像保存格式
}

# 滑窗处理配置
SLIDING_WINDOW = {
    'enabled': True,           # 是否启用滑窗处理
    'window_size': (1024, 1024),  # 窗口大小
    'overlap': 0.3,            # 重叠比例
    'min_area_ratio': 0.4,     # 保留区域的最小面积比例（相对于窗口）
}

# 结果过滤配置
RESULT_FILTER = {
    'min_area': 100,           # 最小地块面积（像素）
    'max_area': 100000,        # 最大地块面积（像素）
    'simplify_tolerance': 0.7, # 轮廓简化容差
    'merge_overlap_threshold': 0.4, # 合并重叠区域的阈值
    
    # 直角化处理配置
    'right_angle_processing': {
        'enabled': True,        # 是否启用直角化处理
        'angle_tolerance': 15.0, # 角度容差（度），与90度的最大偏差
        'min_segment_length': 5.0, # 最小线段长度（像素）
        'max_iterations': 3,     # 直角化迭代次数
    }
}

# 输出配置
OUTPUT = {
    'format': 'shapefile',     # 输出格式：'shapefile' 或 'geojson'
    'crs': 'EPSG:4326',        # 坐标参考系统
    'output_dir': './results/', # 输出目录
}

# 性能优化配置
PERFORMANCE_OPTIMIZATION = {
    # 批处理配置
    'batch_processing': {
        'enabled': True,          # 是否启用批处理
        'batch_size': 8,          # 批处理大小（GPU内存允许的情况下可适当增大）
        'min_windows_for_batch': 8, # 启用批处理的最小窗口数
    },
    
    # GPU加速配置
    'gpu_acceleration': {
        'enabled': True,          # 是否启用GPU加速
        'use_bfloat16': True,     # 是否使用bfloat16混合精度（仅支持Ampere及以上架构GPU）
        'use_tf32': True,         # 是否使用TF32加速（仅支持Ampere及以上架构GPU）
        'min_size_for_gpu': 100,  # 启用GPU处理的最小图像尺寸
    },
    
    # 异步计算配置
    'async_processing': {
        'enabled': False,         # 是否启用异步计算（在Windows环境下禁用以避免死锁）
        'max_workers': None,      # 最大工作线程数，None表示自动根据CPU核心数确定
        'buffer_size': 2,         # 预处理缓冲区大小
    },
    
    # 内存优化配置
    'memory_optimization': {
        'enabled': True,          # 是否启用内存优化
        'cache_size_mb': 1024,    # 缓存大小（MB）
        'garbage_collection_interval': 10, # 垃圾回收间隔（处理的窗口数）
    },
}

# 金字塔配置
IMAGE_PYRAMID = {
    'enabled': False,           # 是否启用金字塔功能
    'levels': 8,               # 金字塔层级数，每增加一层，图像尺寸减半
    'pyramid_dir': 'data/pyramid', # 金字塔数据保存目录
    'overviews_config': {
        'resampling_method': 'NEAREST',  # 重采样方法：NEAREST, BILINEAR, CUBIC, CUBICSPLINE, LANCZOS
        'compress_format': 'DEFLATE',    # 压缩格式：DEFLATE, JPEG, LZW, NONE
        'quality': 90,                   # JPEG压缩质量（1-100）
    },
    'default_level': 6,        # 默认使用的金字塔层级（0为原始分辨率）
    'min_level': 0,            # 最小可用层级
    'max_level': 16             # 最大可用层级
}